package personaje;

import nivel.*;
import logica.*;
import sprite.personajes.*;

/**
 * Clase abstracta utilizada para factorizar propiedades de lo personajes
 * involucrados en el juego.
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public abstract class Personaje {

	/** Nivel al que pertenece */
	protected Nivel nivel;

	/** La logica del personaje */
	protected Logica control;

	/** El casillero en el que se encuentra el personaje */
	protected Casillero casilleroActual;

	/** Iconos del personaje */
	protected SpritePersonaje icono;

	// Consultas
	/**
	 * Retorna el casillero en el que esta posicionado el personaje
	 * 
	 * @return casilleroActual
	 */
	public Casillero getCasilleroActual() {
		return casilleroActual;
	}

	/**
	 * Retorna el nivel en el que se encuentra el personaje
	 * 
	 * @return nivel
	 */
	public Nivel getNivel() {
		return nivel;
	}

	/**
	 * Retorna el icono del personaje
	 * 
	 * @return icono
	 */
	public SpritePersonaje getIcono() {
		return icono;
	}

	/**
	 * Retorna el control asociado al personaje
	 * 
	 * @return control
	 */
	public Logica getControl() {
		return control;
	}
	
	// Comandos

	/**
	 * Setea el casillero donde se encuentra el personaje
	 * 
	 * @param ca
	 *            casillero
	 */
	public void setCasillero(Casillero ca) {
		casilleroActual = ca;
	}

	/**
	 * Setea el nivel en el cual se encuentra el personaje
	 * 
	 * @param nivel
	 */
	public void setNivel(Nivel n) {
		nivel = n;
	}

	/**
	 * Metodo que se encarga de mover el personaje un casillero hacia la derecha
	 * tanto logicamente como graficamente
	 */
	public void moverDerecha() {
		if (control.moverDerecha()) {
			casilleroActual.getCoordenada().setX(casilleroActual.getX() + 8);
			nivel.getGrafica().getManejador().moverDerecha();

		}
	}

	/**
	 * Metodo que se encarga de mover el personaje un casillero hacia la
	 * izquierda tanto logicamente como graficamente
	 */
	public void moverIzquierda() {
		if (control.moverIzquierda()) {
			casilleroActual.getCoordenada().setX(casilleroActual.getX() - 8);
			nivel.getGrafica().getManejador().moverIzquierda();
		}

	}

	/**
	 * Metodo que se encarga de subir el personaje un casillero hacia la
	 * izquierda tanto logicamente como graficamente
	 */
	public void saltar() {

	}

	/**
	 * Metodo que se encarga de bajar el personaje un casillero hacia la
	 * izquierda tanto logicamente como graficamente
	 */
	public void caer() {
		if (control.caer()) {
			control.setCayendo(true);
			control.setSaltando(false);
			casilleroActual.getCoordenada().setY(casilleroActual.getY() + 16);
			nivel.getGrafica().getManejador().moverAbajo();
		} else if (!control.estaSaltando()) {
			control.setCayendo(false);
			control.resetearSaltos();
		}

		if (casilleroActual.getY() >= 208) {
			morir();
		}
	}

	/**
	 * Metodo encargado de informar al nivel que el personaje murio
	 */
	public void morir() {
		nivel.getGrafica().getPanelMario().morir();
		nivel.perdioNivel();

	}

	/**
	 * Setea el control del personaje
	 * 
	 * @param control
	 */
	public void setControl(Logica c) {
		control = c;
	}
}
